// ========== 新增：iox 模块丰富示例与中文注释 ==========
// 目标：为 std::io 相关的功能提供自包含、可测试的示例，包括：
//  - 标准输入/输出（注意在测试中不要阻塞等待输入）
//  - BufReader/BufWriter 使用场景
//  - 以非破坏性方式展示读写、临时文件与目录操作
//  - 显示常见错误处理模式（?、unwrap、match）

use std::fs::File;
use std::io::{self, BufRead, BufReader, BufWriter, Write};

#[cfg(test)]
mod tests {
    use super::*;
    use std::env;

    #[test]
    fn stdout_write_example() {
        // 向 stdout 写入字节，并验证返回的写入字节数
        let n = io::stdout().write(b"iox stdout example\n").unwrap();
        assert!(n > 0);
    }

    #[test]
    fn bufwriter_and_bufreader_example() {
        // 在临时目录下写入一个文件，然后使用 BufReader 读取它
        let cur = env::current_dir().unwrap();
        let mut p = cur.join("src/stdx/iox/temp");
        // 确保目录存在
        std::fs::create_dir_all(&p).unwrap();
        p.push("buf_example.txt");

        {
            // 使用 BufWriter 写入文本（演示缓冲写入）
            let f = File::create(&p).unwrap();
            let mut w = BufWriter::new(f);
            writeln!(w, "line1").unwrap();
            writeln!(w, "line2").unwrap();
            w.flush().unwrap(); // 显式刷新缓冲区
        }

        {
            // 使用 BufReader 逐行读取并收集结果
            let f = File::open(&p).unwrap();
            let r = BufReader::new(f);
            let lines: Vec<_> = r.lines().map(|l| l.unwrap()).collect();
            assert_eq!(lines, vec!["line1".to_string(), "line2".to_string()]);
        }

        // 清理临时文件
        std::fs::remove_file(&p).unwrap();
    }

    #[test]
    fn read_to_string_and_write_example() {
        let cur = env::current_dir().unwrap();
        let mut p = cur.join("src/stdx/iox/temp");
        std::fs::create_dir_all(&p).unwrap();
        p.push("read_write.txt");

        std::fs::write(&p, b"hello io" as &[u8]).unwrap();
        let s = std::fs::read_to_string(&p).unwrap();
        assert_eq!(s, "hello io");
        std::fs::remove_file(&p).unwrap();
    }

    #[test]
    fn nonblocking_stdin_note() {
        // 关键注释：在测试中不应阻塞等待 stdin。这里展示如何读取 stdin（注释掉实际阻塞调用）
        // let mut input = String::new();
        // std::io::stdin().read_line(&mut input).unwrap();
        // println!("read from stdin: {}", input);
        assert!(true, "示例说明：不要在自动化测试中依赖 stdin");
    }
}
